home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 2004 #11 / Amiga Plus CD - 2004 - No. 11.iso / AmiSoft / Misc / emu / fbzx.lha / fbzx / CodesED.h < prev    next >
Text File  |  2004-01-05  |  8KB  |  288 lines

  1. /** Z80: portable Z80 emulator *******************************/
  2. /**                                                         **/
  3. /**                         CodesED.h                       **/
  4. /**                                                         **/
  5. /** This file contains implementation for the ED table of   **/
  6. /** Z80 commands. It is included from Z80.c.                **/
  7. /**                                                         **/
  8. /** Copyright (C) Marat Fayzullin 1994-2002                 **/
  9. /**     You are not allowed to distribute this software     **/
  10. /**     commercially. Please, notify me, if you make any    **/
  11. /**     changes to this file.                               **/
  12. /*************************************************************/
  13.  
  14. /** This is a special patch for emulating BIOS calls: ********/
  15. case DB_FE:     PatchZ80(R);break;
  16. /*************************************************************/
  17.  
  18. case ADC_HL_BC: M_ADCW(BC);break;
  19. case ADC_HL_DE: M_ADCW(DE);break;
  20. case ADC_HL_HL: M_ADCW(HL);break;
  21. case ADC_HL_SP: M_ADCW(SP);break;
  22.  
  23. case SBC_HL_BC: M_SBCW(BC);break;
  24. case SBC_HL_DE: M_SBCW(DE);break;
  25. case SBC_HL_HL: M_SBCW(HL);break;
  26. case SBC_HL_SP: M_SBCW(SP);break;
  27.  
  28. case LD_xWORDe_HL:
  29.   J.B.l=RdZ80(R->PC.W++);
  30.   J.B.h=RdZ80(R->PC.W++);
  31.   WrZ80(J.W++,R->HL.B.l);
  32.   WrZ80(J.W,R->HL.B.h);
  33.   break;
  34. case LD_xWORDe_DE:
  35.   J.B.l=RdZ80(R->PC.W++);
  36.   J.B.h=RdZ80(R->PC.W++);
  37.   WrZ80(J.W++,R->DE.B.l);
  38.   WrZ80(J.W,R->DE.B.h);
  39.   break;
  40. case LD_xWORDe_BC:
  41.   J.B.l=RdZ80(R->PC.W++);
  42.   J.B.h=RdZ80(R->PC.W++);
  43.   WrZ80(J.W++,R->BC.B.l);
  44.   WrZ80(J.W,R->BC.B.h);
  45.   break;
  46. case LD_xWORDe_SP:
  47.   J.B.l=RdZ80(R->PC.W++);
  48.   J.B.h=RdZ80(R->PC.W++);
  49.   WrZ80(J.W++,R->SP.B.l);
  50.   WrZ80(J.W,R->SP.B.h);
  51.   break;
  52.  
  53. case LD_HL_xWORDe:
  54.   J.B.l=RdZ80(R->PC.W++);
  55.   J.B.h=RdZ80(R->PC.W++);
  56.   R->HL.B.l=RdZ80(J.W++);
  57.   R->HL.B.h=RdZ80(J.W);
  58.   break;
  59. case LD_DE_xWORDe:
  60.   J.B.l=RdZ80(R->PC.W++);
  61.   J.B.h=RdZ80(R->PC.W++);
  62.   R->DE.B.l=RdZ80(J.W++);
  63.   R->DE.B.h=RdZ80(J.W);
  64.   break;
  65. case LD_BC_xWORDe:
  66.   J.B.l=RdZ80(R->PC.W++);
  67.   J.B.h=RdZ80(R->PC.W++);
  68.   R->BC.B.l=RdZ80(J.W++);
  69.   R->BC.B.h=RdZ80(J.W);
  70.   break;
  71. case LD_SP_xWORDe:
  72.   J.B.l=RdZ80(R->PC.W++);
  73.   J.B.h=RdZ80(R->PC.W++);
  74.   R->SP.B.l=RdZ80(J.W++);
  75.   R->SP.B.h=RdZ80(J.W);
  76.   break;
  77.  
  78. case RRD:
  79.   I=RdZ80(R->HL.W);
  80.   J.B.l=(I>>4)|(R->AF.B.h<<4);
  81.   WrZ80(R->HL.W,J.B.l);
  82.   R->AF.B.h=(I&0x0F)|(R->AF.B.h&0xF0);
  83.   R->AF.B.l=PZSTable[R->AF.B.h]|(R->AF.B.l&C_FLAG);
  84.   break;
  85. case RLD:
  86.   I=RdZ80(R->HL.W);
  87.   J.B.l=(I<<4)|(R->AF.B.h&0x0F);
  88.   WrZ80(R->HL.W,J.B.l);
  89.   R->AF.B.h=(I>>4)|(R->AF.B.h&0xF0);
  90.   R->AF.B.l=PZSTable[R->AF.B.h]|(R->AF.B.l&C_FLAG);
  91.   break;
  92.  
  93. case LD_A_I:
  94.   R->AF.B.h=R->I;
  95.   R->AF.B.l=(R->AF.B.l&C_FLAG)|(R->IFF&IFF_2? P_FLAG:0)|ZSTable[R->AF.B.h];
  96.   break;
  97.  
  98. case LD_A_R:  
  99.   R->AF.B.h=((R->R & 0x7F) | (R->R2));// -R->ICount);
  100.   R->AF.B.l=(R->AF.B.l&C_FLAG)|(R->IFF&IFF_2? P_FLAG:0)|ZSTable[R->AF.B.h];
  101.   break;
  102.  
  103. case LD_I_A:   R->I=R->AF.B.h;break;
  104. case LD_R_A:   R->R=(byte)(R->AF.B.h);R->R2=(byte)((R->AF.B.h) & 0x80);break;
  105.  
  106. case IM_0:     R->IFF&=~(IFF_IM1|IFF_IM2);break;
  107. case IM_1:     R->IFF=(R->IFF&~IFF_IM2)|IFF_IM1;break;
  108. case IM_2:     R->IFF=(R->IFF&~IFF_IM1)|IFF_IM2;break;
  109.  
  110. case RETI:     M_RET;break;
  111. case RETN:     if(R->IFF&IFF_2) R->IFF|=IFF_1; else R->IFF&=~IFF_1;
  112.                M_RET;break;
  113.  
  114. case NEG:      I=R->AF.B.h;R->AF.B.h=0;M_SUB(I);break;
  115.  
  116. case IN_B_xC:  M_IN(R->BC.B.h);break;
  117. case IN_C_xC:  M_IN(R->BC.B.l);break;
  118. case IN_D_xC:  M_IN(R->DE.B.h);break;
  119. case IN_E_xC:  M_IN(R->DE.B.l);break;
  120. case IN_H_xC:  M_IN(R->HL.B.h);break;
  121. case IN_L_xC:  M_IN(R->HL.B.l);break;
  122. case IN_A_xC:  M_IN(R->AF.B.h);break;
  123. case IN_F_xC:  M_IN(J.B.l);break;
  124.  
  125. case OUT_xC_B: OutZ80(((word)(R->BC.B.l))+256*((word)R->BC.B.h),R->BC.B.h);break;
  126. case OUT_xC_C: OutZ80(((word)(R->BC.B.l))+256*((word)R->BC.B.h),R->BC.B.l);break;
  127. case OUT_xC_D: OutZ80(((word)(R->BC.B.l))+256*((word)R->BC.B.h),R->DE.B.h);break;
  128. case OUT_xC_E: OutZ80(((word)(R->BC.B.l))+256*((word)R->BC.B.h),R->DE.B.l);break;
  129. case OUT_xC_H: OutZ80(((word)(R->BC.B.l))+256*((word)R->BC.B.h),R->HL.B.h);break;
  130. case OUT_xC_L: OutZ80(((word)(R->BC.B.l))+256*((word)R->BC.B.h),R->HL.B.l);break;
  131. case OUT_xC_A: OutZ80(((word)(R->BC.B.l))+256*((word)R->BC.B.h),R->AF.B.h);break;
  132.  
  133. case INI:
  134.   WrZ80(R->HL.W++,InZ80(((word)(R->BC.B.l))+256*((word)R->BC.B.h)));
  135.   R->BC.B.h--;
  136.   R->AF.B.l=N_FLAG|(R->BC.B.h? 0:Z_FLAG);
  137.   break;
  138.  
  139. case INIR:
  140.   WrZ80(R->HL.W++,InZ80(((word)(R->BC.B.l))+256*((word)R->BC.B.h)));
  141.   R->BC.B.h--;R->ICount-=21;R->TStates+=21;  
  142.   if(R->BC.B.h)
  143.       { R->AF.B.l=N_FLAG;R->PC.W-=2; }
  144.   else {
  145.       R->AF.B.l=Z_FLAG|N_FLAG;R->ICount+=5;R->TStates-=5; }
  146.   break;
  147.  
  148. case IND:
  149.   WrZ80(R->HL.W--,InZ80(((word)(R->BC.B.l))+256*((word)R->BC.B.h)));
  150.   R->BC.B.h--;
  151.   R->AF.B.l=N_FLAG|(R->BC.B.h? 0:Z_FLAG);
  152.   break;
  153.  
  154. case INDR:
  155.   WrZ80(R->HL.W--,InZ80(((word)(R->BC.B.l))+256*((word)R->BC.B.h)));
  156.   R->BC.B.h--;R->ICount-=21;R->TStates+=21;
  157.   if(R->BC.B.h) {
  158.       R->AF.B.l=N_FLAG;R->PC.W-=2;
  159.   } else {
  160.       R->AF.B.l=Z_FLAG|N_FLAG;R->ICount+=5;R->TStates-=5; }
  161.   break;
  162.  
  163. case OUTI:  
  164.   I=RdZ80(R->HL.W++);
  165.   OutZ80(((word)(R->BC.B.l))+256*((word)R->BC.B.h),I);
  166.   R->BC.B.h--;
  167.   R->AF.B.l=N_FLAG|(R->BC.B.h? 0:Z_FLAG)|(R->HL.B.l+I>255? (C_FLAG|H_FLAG):0);
  168.   break;
  169.  
  170. case OTIR:
  171.   I=RdZ80(R->HL.W++);  
  172.   OutZ80(((word)(R->BC.B.l))+256*((word)R->BC.B.h),I);
  173.   R->BC.B.h--;
  174.   R->ICount-=21;
  175.   R->TStates+=21;  
  176.   if(R->BC.B.h) {
  177.     R->AF.B.l=N_FLAG|(R->HL.B.l+I>255? (C_FLAG|H_FLAG):0);
  178.     R->PC.W-=2;
  179.   } else {
  180.     R->AF.B.l=Z_FLAG|N_FLAG|(R->HL.B.l+I>255? (C_FLAG|H_FLAG):0);
  181.     R->ICount+=5;
  182.     R->TStates-=5;
  183.   }
  184.   break;
  185.  
  186. case OUTD:
  187.   I=RdZ80(R->HL.W--);
  188.   OutZ80(((word)(R->BC.B.l))+256*((word)R->BC.B.h),I);
  189.   R->BC.B.h--;
  190.   R->AF.B.l=N_FLAG|(R->BC.B.h? 0:Z_FLAG)|(R->HL.B.l+I>255? (C_FLAG|H_FLAG):0);
  191.   break;
  192.  
  193. case OTDR:
  194.   I=RdZ80(R->HL.W--);
  195.   OutZ80(((word)(R->BC.B.l))+256*((word)R->BC.B.h),I);
  196.   R->BC.B.h--;
  197.   R->ICount-=21;
  198.   R->TStates+=21;
  199.   if(R->BC.B.h) {
  200.     R->AF.B.l=N_FLAG|(R->HL.B.l+I>255? (C_FLAG|H_FLAG):0);
  201.     R->PC.W-=2;
  202.   } else {
  203.     R->AF.B.l=Z_FLAG|N_FLAG|(R->HL.B.l+I>255? (C_FLAG|H_FLAG):0);
  204.     R->ICount+=5;
  205.     R->TStates-=5;
  206.   }
  207.   break;
  208.  
  209. case LDI:
  210.   WrZ80(R->DE.W++,RdZ80(R->HL.W++));
  211.   R->BC.W--;
  212.   R->AF.B.l=(R->AF.B.l&~(N_FLAG|H_FLAG|P_FLAG))|(R->BC.W? P_FLAG:0);
  213.   break;
  214.  
  215. case LDIR:
  216.   WrZ80(R->DE.W,RdZ80(R->HL.W));
  217.   R->DE.W++;
  218.   R->HL.W++;
  219.   R->BC.W--;
  220.   R->ICount-=21;
  221.   R->TStates+=21;
  222.   R->AF.B.l&=~(N_FLAG|H_FLAG|P_FLAG);
  223.   if(R->BC.W) {
  224.       R->AF.B.l|=N_FLAG;R->PC.W-=2;
  225.   } else {
  226.       R->ICount+=5;R->TStates-=5;
  227.   }
  228.   break;
  229.  
  230. case LDD:
  231.   WrZ80(R->DE.W--,RdZ80(R->HL.W--));
  232.   R->BC.W--;
  233.   R->AF.B.l=(R->AF.B.l&~(N_FLAG|H_FLAG|P_FLAG))|(R->BC.W? P_FLAG:0);
  234.   break;
  235.  
  236. case LDDR:
  237.   WrZ80(R->DE.W--,RdZ80(R->HL.W--));
  238.   R->BC.W--;
  239.   R->ICount-=21;
  240.   R->TStates+=21;
  241.   R->AF.B.l&=~(N_FLAG|H_FLAG|P_FLAG);
  242.   if(R->BC.W) {
  243.       R->AF.B.l|=N_FLAG;R->PC.W-=2;
  244.   } else {
  245.       R->ICount+=5; R->TStates-=5;
  246.   }
  247.   break;
  248.  
  249. case CPI:
  250.   I=RdZ80(R->HL.W++);
  251.   J.B.l=R->AF.B.h-I;
  252.   R->BC.W--;
  253.   R->AF.B.l =
  254.     N_FLAG|(R->AF.B.l&C_FLAG)|ZSTable[J.B.l]|
  255.     ((R->AF.B.h^I^J.B.l)&H_FLAG)|(R->BC.W? P_FLAG:0);
  256.   break;
  257.  
  258. case CPIR:
  259.   I=RdZ80(R->HL.W++);
  260.   J.B.l=R->AF.B.h-I;
  261.   R->BC.W--;R->ICount-=21;R->TStates+=21;
  262.  
  263.   R->AF.B.l =
  264.     N_FLAG|(R->AF.B.l&C_FLAG)|ZSTable[J.B.l]|
  265.     ((R->AF.B.h^I^J.B.l)&H_FLAG)|(R->BC.W? P_FLAG:0);
  266.   if(R->BC.W&&J.B.l) R->PC.W-=2; else { R->ICount+=5;R->TStates-=5;}
  267.   break;  
  268.  
  269. case CPD:
  270.   I=RdZ80(R->HL.W--);
  271.   J.B.l=R->AF.B.h-I;
  272.   R->BC.W--;
  273.   R->AF.B.l =
  274.     N_FLAG|(R->AF.B.l&C_FLAG)|ZSTable[J.B.l]|
  275.     ((R->AF.B.h^I^J.B.l)&H_FLAG)|(R->BC.W? P_FLAG:0);
  276.   break;
  277.  
  278. case CPDR:
  279.   I=RdZ80(R->HL.W--);
  280.   J.B.l=R->AF.B.h-I;
  281.   R->BC.W--;R->ICount-=21;
  282.   R->TStates+=21;
  283.   R->AF.B.l =
  284.     N_FLAG|(R->AF.B.l&C_FLAG)|ZSTable[J.B.l]|
  285.     ((R->AF.B.h^I^J.B.l)&H_FLAG)|(R->BC.W? P_FLAG:0);
  286.   if(R->BC.W&&J.B.l) R->PC.W-=2; else { R->ICount+=5; R->TStates-=5;}
  287.   break;
  288.